datatable:比pandas更快的GB量级的库
虽然pandas是数据分析、机器学习等必备利器,但现在流行的机器学习应用训练模型动辄需要GB级别的数据,很多时候pandas无法快速读取大数据文件或者进行高效运算,甚至可能存在内存溢出等情况。
如果是R语言的用户应该很熟悉data.table库, 该库是R语言中data.frame库的拓展库,可以让R语言用户轻松处理海量数据,比如让电脑很轻松高速地读取100Gb文件。现在python生态圈也有了自己的data.table,这个库的名字叫做datatable。目前datatable不支持windows系统,相应的windows版本正在开发中。
安装
!pip3 install datatable
一、读取数据
读取的数据先转化为Frame对象,是一种拥有很多行很多列的二维数组,功能类似于DataFrame或者SQL表。
我们用的测试数据来源于Kaggle的lending数据集 https://www.kaggle.com/wendykan/lending-club-loan-data#loan.csv, 该数据集包括2007-2015年的含有相关145个特征,共计226万条贷款记录。文件大概700M,我们可以使用pandas和datatable库分别读取,测试读取速度
import numpy as np
import pandas as pd
import datatable as dt
%time datatable_df = dt.fread('data.csv')
Run
CPU times: user 33.2 s, sys: 8.96 s, total: 42.1 s
Wall time: 24.6 s
再来看看pandas读取
%time pandas_df = pd.read_csv('data.csv')
CPU times: user 53.5 s, sys: 15 s, total: 1min 8s
Wall time: 1min 12s
从上面两个读取方式看,pandas用时1分钟,而datatable用时14.2秒
二、 Frame转换
datatable读取数据可以转化为pd.DataFrame
#转化为dataframe
%time pandas_df = datatable_df.to_pandas()
CPU times: user 21.3 s, sys: 28.8 s, total: 50.1 s
Wall time: 1min 3s
正常来讲使用datatable读取数据再转化为pd.DataFrame格式 比 直接使用pandas读取要快一些。
三、基本的Frame属性
print(datatable_df.shape) # (行数, 列数)
print(datatable_df.names[:5]) # 前5列的字段名
print(datatable_df.stypes[:5]) # 列的数据类型(前5列)
(2260668, 145)
('id', 'member_id', 'loan_amnt', 'funded_amnt', 'funded_amnt_inv')
(stype.bool8, stype.bool8, stype.int32, stype.int32, stype.float64)
显示前10行
datatable_df.head(10)
字段名的颜色表示数据类型,其中红色表示文本,绿色表示整数,蓝色表示浮点型。
四、描述性统计
在pandas中进行描述性统计是一件很吃内存的进程,但datatable不怕这事。
datatable_df.sum()
datatable_df.nunique()
datatable_df.sd()
datatable_df.max()
datatable_df.min()
datatable_df.mean()
例如我们分别使用datatable和pandas来计算mean
%time datatable_df.mean()
CPU times: user 2.67 ms, sys: 729 µs, total: 3.4 ms
Wall time: 2.32 ms
因为会抛出内存错误,上面的 pandas_df.mean()
无法在pandas中完成,所以大邓将代码加上注释,防止大家运行崩溃。
#pandas_df.mean()
五、数据操作
数据的操作方法与dataframe类似
5.1 数据选择
选中所有行, 列只选择funded_amnt列
datatable_df[:,'funded_amnt']
5.2 排序
根据 funded_amnt_inv 列进行排序
# datatable
%time datatable_df.sort('funded_amnt_inv')
CPU times: user 534 ms, sys: 67.96 ms, total: 602 ms
Wall time: 179 ms
还别说,datatable一眨眼功夫就出来,排序真的很快
# pandas排序
%time pandas_df.sort_values(by = 'funded_amnt_inv')
CPU times: user 8.76 s, sys: 2.87 s, total: 11.6 s
Wall time: 12.4 s
而pandas排序用了12.4s,慢!
5.3 删除列
删除指定列,如下。
del datatable_df[:, '列名']
5.4 条件筛选
条件筛选也跟dataframe很类似,这里要注意代码中的f代指的是Frame。输出的数据行列分别:
所有的行中loan_amnt要大于funded_amnt
只输出loan_amnt列
datatable_df[dt.f.loan_amnt>dt.f.funded_amnt, "loan_amnt"]
5.5 保存结果
datatable_df.to_csv('output.csv')
总结
与鼎鼎大名的pandas相比,datatable有很高效的执行速度,这在处理大型数据集时肯定是一个福音。 然而就功能而言,datatable落后于pandas。 但由于datatable仍在更新迭代,我们可能会在未来看到该库的一些重要补充。
推荐阅读
2019Stata & Python 实证计量与爬虫分析暑期工作坊
pandas_profiling:生成动态交互的数据探索报告
cufflinks: 让pandas拥有plotly的炫酷的动态可视化能力
使用Pandas、Jinja和WeasyPrint制作pdf报告
大神kennethreitz写出requests-html号称为人设计的解析库
如果想要获取更多例子,可以关注本公众号,
后台回复'20190609'获得本教程的notebook代码下载方式